#include <iostream>
#include "mutex.hpp"
#include <pthread.h>
#include <unistd.h>

using namespace mutexModule;

int count = 2000;

Mutex mutex;

void* routine1(void* args)
{
    while (true)
    {
        // MutexGuard guard(mutex);
        mutex.lock();
        if (count > 0)
        {
            usleep(1000);
            --count;
            std::cout << (char*)args << " count : " << count << std::endl;
            mutex.unlock();
        }
        else
        {
            mutex.unlock();
            break;
        }

        usleep(10);
    }

    return nullptr;
}

int main()
{
    pthread_t tid1, tid2, tid3;

    pthread_create(&tid1, nullptr, routine1, (void*)"thread - 1");
    pthread_create(&tid2, nullptr, routine1, (void*)"thread - 2");
    pthread_create(&tid3, nullptr, routine1, (void*)"thread - 3");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);
    
    return 0;
}

// #include <iostream>
// #include "mutex.hpp"
// #include <pthread.h>
// #include <unistd.h>

// int count = 2000;

// void* routine1(void* args)
// {
//     while (true)
//     {
//         if (count > 0)
//         {
//             usleep(100);
//             --count;
//             std::cout << (char*)args << " count : " << count << std::endl;
//         }
//         else
//         {
//             break;
//         }

//         usleep(100);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid1, tid2, tid3;

//     pthread_create(&tid1, nullptr, routine1, (void*)"thread - 1");
//     pthread_create(&tid2, nullptr, routine1, (void*)"thread - 2");
//     pthread_create(&tid3, nullptr, routine1, (void*)"thread - 3");

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);
//     pthread_join(tid3, nullptr);
    
//     return 0;
// }
